package project_studentmanager_test;

import java.util.Scanner;

/**
 * StudentView 类：
 * 提供学生管理系统的用户界面，包含添加、修改、删除、查看学生以及退出系统的功能。
 */
public class StudentView {

    // 用于接收用户在控制台的输入
    Scanner sc = new Scanner(System.in);

    // 用于存储学生对象的数组，初始容量为50
    Student[] students = new Student[50];

    // 记录当前已添加的学生数量，也是下一个添加学生的位置索引
    int count = 0;

    // 临时数组，用于删除操作后存储新的学生列表，长度比原数组少1
    Student[] newStudents = new Student[students.length - 1];

    /**
     * 启动方法：开启学生管理系统的主菜单循环，直到用户选择退出。
     */
    public void start() {
        while (true) {
            // 打印主菜单
            System.out.println("-----------学生管理系统-----------");
            System.out.println("1 添加学生");
            System.out.println("2 修改学生");
            System.out.println("3 删除学生");
            System.out.println("4 查看学生");
            System.out.println("5 退出系统");
            System.out.println("请选择(1-5):");

            // 读取用户菜单选项
            int num = sc.nextInt();
            System.out.println("--------------------------------");

            // 根据用户选项调用对应的方法
            switch (num) {
                case 1:
                    addStudent();   // 添加学生
                    break;
                case 2:
                    updateStudent(); // 修改学生
                    break;
                case 3:
                    deleteStudent(); // 删除学生
                    break;
                case 4:
                    findAllStudent(); // 查看所有学生
                    break;
                case 5:
                    // 退出确认
                    System.out.println("是否退出?按0为退出/按9为取消");
                    int key = sc.nextInt();
                    if (key == 0) {
                        System.out.println("再见,欢迎再来");
                        return; // 结束 start 方法，退出系统
                    } else if (key == 9) {
                        break;   // 返回主菜单
                    }
            }
        }
    }

    /**
     * 查看所有学生的方法：
     * 先按学号对 students 数组中的学生进行升序排序，再打印学生信息。
     */
    private void findAllStudent() {
        // 打印表头
        System.out.println("学号" + "\t" + "姓名" + "\t" + "年龄" + "\t" + "性别");

        // 使用冒泡排序对已添加的学生按学号进行升序排列
        for (int j = 0; j < count - 1; j++) {
            for (int i = 0; i < count - 1 - j; i++) {
                if (students[i].getId() > students[i + 1].getId()) {
                    // 交换相邻两个元素
                    Student temp = students[i];
                    students[i] = students[i + 1];
                    students[i + 1] = temp;
                }
            }
        }

        if (count == 0) {
            // 如果没有学生，提示相应信息
            System.out.println("对不起,现在班级没有学生,待开班.........");
        } else {
            // 依次打印每个学生的信息
            for (int i = 0; i < count; i++) {
                System.out.println(students[i].getId() + "\t"
                        + students[i].getName() + "\t"
                        + students[i].getAge() + "\t"
                        + students[i].getSex());
            }
        }
    }

    /**
     * 删除学生的方法：
     * 根据学号查找要删除学生的索引，然后使用数组拷贝创建新的学生数组，删除指定位置的元素。
     */
    private void deleteStudent() {
        System.out.println("请您输入要删除的学生学号:");
        int id = sc.nextInt();
        // 根据学号在 students 数组中查找要删除的学生索引
        int removeIndex = ArrayUtils.findIndexById(students, id, count);

        // 将删除元素前的部分拷贝到 newStudents 数组
        System.arraycopy(students, 0, newStudents, 0, removeIndex);
        // 将删除元素后的部分拷贝到 newStudents 数组，从 removeIndex 位置开始
        System.arraycopy(students, removeIndex + 1, newStudents, removeIndex,
                students.length - removeIndex - 1);

        // 将 students 引用指向新的数组，并减少 count
        students = newStudents;
        count--;

        System.out.println("删除成功");
    }

    /**
     * 修改学生的方法：
     * 根据学号查找要修改学生的索引，然后创建新的 Student 对象替换原有对象。
     */
    private void updateStudent() {
        System.out.println("请您输入要修改的学生学号:");

        int id = sc.nextInt();
        int updateIndex = ArrayUtils.findIndexById(students, id, count);

        // 提示用户输入新的学生姓名、年龄和性别
        System.out.println("请您输入学生姓名:");
        String name = sc.next();
        System.out.println("请您输入学生年龄:");
        int age = sc.nextInt();
        System.out.println("请您输入学生性别:");
        String sex = sc.next();

        // 使用新的属性创建 Student 对象并替换原对象
        Student student = new Student(id, name, age, sex);
        students[updateIndex] = student;

        System.out.println("修改成功!!!");
    }

    /**
     * 添加学生的方法：
     * 从控制台获取学生的各项属性，创建 Student 对象并添加到 students 数组中。
     */
    private void addStudent() {
        System.out.println("请您输入学生学号:");
        int id = sc.nextInt();
        System.out.println("请您输入学生姓名:");
        String name = sc.next();
        System.out.println("请您输入学生年龄:");
        int age = sc.nextInt();
        System.out.println("请您输入学生性别:");
        String sex = sc.next();

        // 创建新的 Student 对象并加入数组
        Student student = new Student(id, name, age, sex);
        students[count] = student;
        count++; // 学生计数加一

        System.out.println("添加成功!!!");
    }
}